package com.stock_t.config;


import com.stock_t.config.datasource.DataSourceType;
import com.stock_t.config.datasource.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.FileCopyUtils;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;

/**
 * 数据库初始化器
 * 负责在应用启动时创建必要的数据库表结构
 * - SYS_API_TABLE_MAPPING: API映射表
 * - SYS_API_REQUEST_LOG: API请求日志表
 */
@Slf4j
@Configuration
public class DatabaseInitializer {
    
    @Autowired
    private DataSource dataSource;
    
    /**
     * 初始化数据库
     * 在应用启动时自动执行
     */
    @PostConstruct
    public void initDatabase() {
        log.info("开始初始化数据库表结构...");
        try {
            // 设置动态数据源上下文为主库
            DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
            
            // 使用JDBC直接执行脚本，以处理Oracle PL/SQL语法
            try (Connection conn = dataSource.getConnection();
                 Statement stmt = conn.createStatement()) {
                
                // 读取SQL文件内容
                ClassPathResource resource = new ClassPathResource("sql/create_tables.sql");
                String sqlScript = new String(FileCopyUtils.copyToByteArray(resource.getInputStream()));
                
                // 按分号分割SQL语句并逐个执行
                String[] sqlStatements = sqlScript.split(";");
                for (String sql : sqlStatements) {
                    // 去除空白字符后如果还有内容，则执行
                    if (sql.trim().length() > 0) {
                        stmt.execute(sql.trim());
                    }
                }
                
                log.info("数据库表结构初始化成功");
            }
        } catch (Exception e) {
            log.error("初始化数据库表结构时出错：", e);
        } finally {
            // 清除数据源上下文
            DynamicDataSourceContextHolder.clearDataSourceType();
        }
    }
}